package cn.hss.io.buffered;

import java.io.*;

/**字节流、字符流、缓冲流复制文件效率测试
 * @author 作者：HeShaoShuai
 * @Email 邮箱：2569819541@qq.com
 * @Date 日期：2023/4/26 9:50
 * @Package 包名：cn.hss.io.buffered
 * @Project 项目名：JavaSE
 * @Version 1.0
 */
public class CopyFiles {
	public static void main(String[] args) throws Exception {
		//记录开始时间
		long startTime = System.currentTimeMillis();
		//该方法为字节流
		//method1();//133毫秒
		//该方法为字节缓冲流
		//method3();//31毫秒
		//该方法为字符
		//method2();//653毫秒
		//该方法为字符缓冲流
		//若使用readLine()方法读数据，newLine()方法写数据，共耗时17094毫秒
		method4();//489毫秒
		long stopTime = System.currentTimeMillis();
		System.out.println("共耗时："+(stopTime-startTime)+"毫秒");
	}
	//使用字符缓冲流读写数据
	public static void method4()throws Exception{
		//1.创建字符缓冲输入流对象
		BufferedReader br = new BufferedReader(
				new FileReader("D:\\BaiduNetdiskDownload\\5.SpringMVC.zip"));
		//2.字符缓冲输出对象
		BufferedWriter bw =	new BufferedWriter(
				new FileWriter("D:\\BaiduNetdiskDownload\\copy_5.SpringMVC.zip"));
		//3.读写数组
		char[] chars=new char[1024];
		int len;
//		while ((len = br.read(chars)) !=-1){
//			bw.write(chars,0,len);
//		}
		//使用字符缓冲流的特有功能来读写数据
		//定义字符串变量保存读取的一行数据
		String line;
		while ((line = br.readLine())!=null){
			//一行一行写
			bw.newLine();
		}
		System.out.println("复制完毕");
		//关闭资源
		bw.close();
		br.close();
	}
	//使用字节缓冲流读写数据
	public static void method3()throws Exception{
		//1.创建字节缓冲输入流对象
		BufferedInputStream bis = new BufferedInputStream(
				new FileInputStream("D:\\BaiduNetdiskDownload\\5.SpringMVC.zip"));
		//2.字节缓冲输出流对象
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream("D:\\BaiduNetdiskDownload\\copy_5.SpringMVC.zip"));
		//使用字节缓冲流读取数据
		//构建字节数组
		byte[] bytes=new byte[1024];
		int ble;
		while ((ble=bis.read(bytes)) !=-1){
			bos.write(bytes,0,ble);
		}
		System.out.println("复制完毕");
		//关闭资源
		bos.close();
		bis.close();

	}
	//使用字符流读写一个字节数组
	public static void method2(){
		FileReader fr=null;
		FileWriter fw=null;
		try {
			//1。创建字节流对象
			//1.1 创建字节输入流
			fr =
					new FileReader("D:\\BaiduNetdiskDownload\\5.SpringMVC.zip");
			//1.2 创建字节输出流
			fw =
					new FileWriter("D:\\BaiduNetdiskDownload\\copy_5.SpringMVC.zip");
			//2.读写文件
			char[] bytes = new char[1024];
			int len;
			while((len=fr.read(bytes)) != -1){
				fw.write(bytes,0,len);
			}
			System.out.println("复制完毕！！请注意查收");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e){
			e.printStackTrace();
		}
		finally {
			//关闭资源
			if (fw != null) {
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fw != null) {
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	//使用字节流读写一个字节数组
	public static void method1(){
		FileInputStream fis =null;
		FileOutputStream fos =null;
		try {
			//1。创建字节流对象
			//1.1 创建字节输入流
			fis =
					new FileInputStream("D:\\BaiduNetdiskDownload\\5.SpringMVC.zip");
			//1.2 创建字节输出流
			fos =
					new FileOutputStream("D:\\BaiduNetdiskDownload\\copy_5.SpringMVC.zip");
			//2.读写文件
			byte[] bytes = new byte[1024];
			int len;
			while((len=fis.read(bytes)) != -1){
				fos.write(bytes,0,len);
			}
			System.out.println("复制完毕！！请注意查收");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e){
			e.printStackTrace();
		}
		finally {
			//关闭资源
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
